package study_thread;


import java.util.concurrent.Exchanger;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-12-12 20:24
 **/

/**
 * Exchanger 交换
 * 可以在线程之间交换对象
 */
public class Test_Exchanger {

    /**
     * Exchanger（交换者）是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。
     * 它提供一个同步点，在这个同步点两个线程可以交换彼此的数据。
     * 这两个线程通过exchange方法交换数据， 如果第一个线程先执行exchange方法，它会一直等待第二个线程也执行exchange，
     * 当两个线程都到达同步点时，这两个线程就可以交换数据，将本线程生产出来的数据传递给对方。
     * 因此使用Exchanger的重点是成对的线程使用exchange()方法，
     * 当有一对线程达到了同步点，就会进行交换数据。因此该工具类的线程对象是成对的。
     * <p>
     * Exchanger类提供了两个方法，String exchange(V x):用于交换，启动交换并等待另一个线程调用exchange；
     * String exchange(V x,long timeout,TimeUnit unit)：用于交换，启动交换并等待另一个线程调用exchange，并且设置最大等待时间，当等待时间超过timeout便停止等待。
     */

    static Exchanger<String> exchanger = new Exchanger<>();

    public static void main(String[] args) {
        new Thread(() -> {
            String s = "T1";
            try {
                s = exchanger.exchange(s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + s);
        }, "t1").start();

        new Thread(() -> {
            String s = "T2";
            try {
                s = exchanger.exchange(s);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " " + s);
        }, "t2").start();
    }
}
